package dletc.Map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

/**
 * HashMap底层是哈希表数据结构，是非线程安全的，【在JDK8之后，如果哈希表单向链表元素超过8个
 * 会变成二叉树数据结构，当二叉树上的节点数量小于6时，会重新变成单向链表结构】
 * 
 * HashMap初始化容量16 默认加载因子0.75f 扩容 新容量是原容量的2倍。
 * 终结结论：
 * 		放在HashMap集合key部分的，以及放在HashMap集合中的元素，必须重写HashCode和equals方法
 * 对于哈希表数据结构来说：
 * 		如果o1和o2的hash值相同，一定是放到同一个单项链表上
 * 		如果o1和o2的hash值不同，但由于哈希算法执行结束之后转换的数组下标可能相同，此时会发生：“哈希碰撞”
 */
public class HashMapTest {
	
	public static void main(String[] args) {
		
		HashMap<String, String> hm = new HashMap<>();
			//1）添加键值对：put()方法
		hm.put("01", "张三");
		hm.put("02", "Iven");
		hm.put("03", "lisi");
		hm.put("04", "wangwu");
		hm.put("05", "zhaoliu");
		  	//2）通过key找value  V get(Object key)
		String string = hm.get("01");
		System.out.println(string);
		  	//3）判断是否包含某个key  boolean containsKey(Object key)
		boolean containsKey = hm.containsKey("03");
		System.out.println(containsKey);
		  	//4）判断是否包含某个value  boolean containsValue(Object value) 
		boolean containsValue = hm.containsValue("Iven");
		System.out.println(containsValue);
		  	//5）清空集合  void clear()
		//hm.clear();
		  	//6）判断是否为空  boolean isEmpty()
		boolean empty = hm.isEmpty();
		System.out.println(empty);
		  	//7）获得所有的key  Set<K> keySet()  
		Set<String> keySet = hm.keySet();
		for(String key: keySet){
			System.out.println(key + "----" + hm.get(key));
		}
		  	//8）删除数据  V remove(Object key) 
		String remove = hm.remove("01");
		System.out.println(remove);
		  	//9）集合长度  int size()
		int size = hm.size();
		System.out.println(size);
		System.out.println();
		  	//10）获得所有的value  Collection<V> values() 
		Collection<String> values = hm.values();
		Iterator<String> it = values.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
		
		System.out.println();
		  	//11) 将集合k/v元素封装到set集合中（就是转成set集合了）   Set<Map.Entry<K,V>> entrySet()
		Set<Entry<String, String>> entrySet = hm.entrySet();
		
		for(Entry<String, String> entry: entrySet){
			String key = entry.getKey();
			String value = entry.getValue();
			System.out.println(key + "----------" + value);
		}
	}
}
